Skip to content

S16-00 专题-网络请求-WebSocket

[TOC]

索引【

WebSocket

WebSocket 是一种基于 TCP 的全双工通信协议,允许客户端与服务器在单个长连接上实时双向传输数据。与 HTTP 的“请求-响应”模式不同,WebSocket 支持服务器主动推送数据,适用于实时性要求高的场景,如聊天应用、实时游戏、股票行情。

对比HTPP

  • 连接方式:WebSocket 通过一次 HTTP 握手(状态码 101)升级协议,后续使用独立的数据帧通信。
  • 通信模式:HTTP 是无状态的,每次请求需客户端发起;WebSocket 支持双向实时通信。
  • 性能:WebSocket 减少了重复的 HTTP 头开销,传输效率更高。

基本使用

ts
// 创建 WebSocket 连接(ws 为普通,wss 为加密)
const ws = new WebSocket('wss://example.com/socket');

// 监听连接建立
ws.onopen = () => {
  ws.send('Connected!'); // 发送数据(支持字符串、ArrayBuffer、Blob)
};

// 接收服务器消息
ws.onmessage = (event) => {
  console.log('Received:', event.data);
};

// 处理错误
ws.onerror = (error) => {
  console.error('WebSocket error:', error);
};

// 连接关闭
ws.onclose = () => {
  console.log('Connection closed');
};

image-20250317174905767

概述

Socket.IO 是一个基于事件的实时双向通信库,构建在 WebSocket 协议之上,同时提供向后兼容的多种传输方式,如长轮询。它简化了实时应用的开发,支持复杂场景(如房间管理、广播、断线重连),适用于聊天、实时协作、游戏等场景。

官方demo简单聊天室-服务端

客户端 socket.io-client

安装

sh
pnpm i socket.io-client

基本使用

ts
import { io } from 'socket.io-client';

// 1. 连接服务器
const socket = io('http://localhost:3000', {
  transports: ['websocket'], // 强制使用 WebSocket
  auth: {
    token: 'user-auth-token' // 身份验证
  }
});

// 2. 监听连接成功
socket.on('connect', () => {
  console.log('已连接到服务器');
  socket.emit('chat', 'Hello Server!'); // 3. 发送消息
});

// 4. 接收服务器消息
socket.on('chat', (message) => {
  console.log('收到消息:', message);
  socket.close() // 6. 关闭链接
});

// 5. 处理错误
socket.on('connect_error', (error) => {
  console.error('连接失败:', error.message);
});

// 7. 监听连接关闭
socket.on('disconnect', () => {
  console.error('连接关闭');
})

跨域问题

如果客户端和服务端代码运行在不同的端口/域名上时,会出现跨域问题:

image-20250317180932980

可以通过在服务端开启CORS后重启项目解决该问题:

image-20250317181031167

服务端 socket.io

安装

sh
pnpm i socket.io

基本使用:使用Express搭建服务器

ts
const express = require('express');
const { createServer } = require('http');
const { Server } = require('socket.io');

const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
  cors: {
    origin: "https://your-frontend-domain.com", // 允许的源
  }
});

// 监听客户端连接
io.on('connection', (socket) => {
  console.log('客户端连接:', socket.id);

  // 自定义事件:接收消息
  socket.on('chat', (message) => {
    console.log('收到消息:', message);
    // 广播给所有客户端(除发送者)
    socket.broadcast.emit('chat', message);
  });

  // 断开连接
  socket.on('disconnect', () => {
    console.log('客户端断开:', socket.id);
  });
});

httpServer.listen(3000, () => {
  console.log('服务器运行在 http://localhost:3000');
});

API【

WebSocket【

new WebSocket()

new WebSocket()(url, protocols?)

  • url:``,

  • protocols?:``,

  • 返回:

  • :``,

  • 语法:

    • ****:
    • ****:
  • 特性:

    • ****:
    • ****:
  • 常见用途:

    • ****:

      js
    • ****:

      js
    • ****:

      js
  • 注意事项:

    • ****:
    • ****:
  • 示例:

    js

onopen【

onclose【

onmessage【

onerror【

readyState【

send()【

close()【

socket.io【

io()【

io.to()【

io.of()【

io.use()【

emit()【

on()【

off()【

removeAllListeners()【

join()【